/*
 * buffer.h
 *
 *  Created on: 06.04.2010
 *      Author: Florian Gref
 *
 */
#ifndef _BUFFER_
#define _BUFFER_
#include"../exceptions/noMoreChar_exception.h"
#include "../konstanten/cons.h"
#include <stdlib.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include"../exceptions/unableToGoBackException.h"

class Buffer {

private:
	/**
	 *	Pointer auf ein File
	 */
	FILE* src_ptr;

    /**
	 *	Pointer auf ein File
	 */
	FILE* out_ptr;

	/**
	*	Char-Array für die wandlung von int -> char
	*/
	char* number;

	char* text;

	/**
	 * pointer auf den aktuell verwendeten Buffer
	 */
	char* current_ptr;

	/*
	 * Buffer 1
	 */
	char* buffer1;

	/**
	 * Buffer 2
	 */
	char* buffer2;

	/**
	 * gibt die aktuelle Position im Buffer an.
	 */
	long int position;

	/**
	 * ist genau dann true , wenn der Buffer 2 geladen ist und Buffer 1 voll ist.
	 */
	bool bufferLoaded;

	/**
	 * wird bei der Initialisierung des Buffers aufgerufen, um sicherzustellen,
	 * dass der Buffer vor seiner Verwendung geladen ist.
	 */
	void load();

	/**
	 * gibt genau dann true zurueck, wenn der Zaehler größer als der erste Buffer ist.
	 */
	void changeBuffer();

	/**
	 * zaehlt die verbleibenden Zeichen im Buffer
	 */
	long int charCount;

	/**
	 * ist genau dann true, wenn einen Buffer zurueckgesprungen wurde.
	 */
	bool wentBack;

	/**
	 * laed den Buffer voll.
	 */
	void buffer();

	/**
	*	füegt an die uebergebene Stelle(Index) ein TAB ein.
	*/
	void insertTab(int index,char* array);



public:

	/**
	 * ist genau dann true , wenn das Ende der Quelldatei erreicht ist.
	 */
	bool endOfFileNear;

	/**
	 * Anzahl der Zeichen der Quelldatei.
	 */
	long int src_size;

	/**
	 * Buffer erstellen und Ein- und Ausgabedatei per Pfad angeben.
	 * @param src Quelldatei
	 */
	Buffer(char* src, char* out);

	/**
	 * nimmt dass zuletzt durch getChar() übergebene Zeichen wieder zurueck,
	 * indem intern der Zeiger auf den Buffer um eine Stelle zurueck geschoben wird.
	 */
	void ungetChar();

	/**
	 * Erstellt anhand des übergebenen Tokentypes einen String mit dem jeweiligen Typ-Namen und gibt diesen zurueck.
	 */
	char* tokentypeToString(tokentype token);

	/**
	 * Erstellt die datei out.txt
	 */
	void writeTokentypeToFile(tokentype token, int line, int column,char* lexem=0);

	void writeTokentypeToFile(tokentype t, int nLine, int nColumn,
			long wert);
	/**
	 * uebergibt zeichenweise den Buffer. Mit jedem Aufruf ein Zeichen.
	 */
	char getChar();

	/**
	 * wandelt die uebergebene Zahl n -> char*
	 */
	char* numberToChar(long int n);

	virtual ~Buffer();
};
#endif

